home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.OpenProm / sunromvec.h < prev    next >
C/C++ Source or Header  |  1991-01-13  |  20KB  |  474 lines

  1. /*
  2.  * sunromvec.h
  3.  *
  4.  * @(#)sunromvec.h 1.19 89/07/12 SMI
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. #ifndef _mon_sunromvec_h
  9. #define _mon_sunromvec_h
  10.  
  11. #include <sys/types.h>
  12. #include <sys/param.h>
  13.  
  14. #if defined(sun4c) || defined(sun3x)
  15. /*
  16.  * This structure defines a segment of physical memory. To support
  17.  * sparse physical memory, the PROMs construct a list of these structures
  18.  * representing what memory is present. On other machines, the kernel will
  19.  * fake up the physical memory list without this structure.
  20.  */
  21. struct physmemory {
  22.         unsigned int address;
  23.         unsigned int size;
  24.     struct physmemory *next;
  25. };
  26. #endif sun4c || sun3x
  27.  
  28. /*
  29.  * Autoconfig operations
  30.  */
  31. struct config_ops {
  32.     int (*devr_next)(/* int nodeid */);
  33.     int (*devr_child)(/* int nodeid */);
  34.     int (*devr_getproplen)(/* int nodeid; caddr_t name; */);
  35.     int (*devr_getprop)(/* int nodeid; caddr_t name; addr_t value; */);
  36.     int (*devr_setprop)(/* int nodeid; caddr_t name; addr_t value; int len; */);
  37.     int (*devr_nextprop)(/* int nodeid; caddr_t previous; */);
  38. };
  39.  
  40. #ifdef OPENPROMS
  41. #  include <mon/openprom.h>
  42. #else OPENPROMS
  43.  
  44. /*
  45.  * This file defines the entire interface between the ROM 
  46.  * Monitor and the programs (or kernels) that run under it.  
  47.  * 
  48.  * The main Sun-2 and Sun-3 interface consists of
  49.  * the VECTOR TABLE at the front of the Boot PROM.
  50.  * 
  51.  * The main Sun-4 interface consists of (1) the VECTOR TABLE and (2) the 
  52.  * TRAP VECTOR TABLE, near the front of the Boot PROM.  Beginning at address
  53.  * "0x00000000", there is a 4K-byte TRAP TABLE containing 256 16-byte entries.
  54.  * Each 16-byte TRAP TABLE entry contains the executable code associated with
  55.  * that trap.  The initial 128 TRAP TABLE entries are dedicated to hardware
  56.  * traps while, the final 128 TRAP TABLE entries are reserved for programmer-
  57.  * initiated traps.  With a few exceptions, the VECTOR TABLE, which appeared
  58.  * in Sun-2 and Sun-3 firmware, follows the TRAP TABLE.  Finally, the TRAP 
  59.  * VECTOR TABLE follows the VECTOR TABLE.  Each TRAP VECTOR TABLE entry 
  60.  * contains the address of the trap handler, which is eventually called to 
  61.  * handle the trap condition.
  62.  *
  63.  * These tables are the ONLY knowledge the outside world has of this rom.
  64.  * They are referenced by hardware and software.  Once located, NO ENTRY CAN
  65.  * BE ADDED, DELETED or RE-LOCATED UNLESS YOU CHANGE THE ENTIRE WORLD THAT
  66.  * DEPENDS ON IT!  Notice that, for Sun-4, EACH ENTRY IN STRUCTURE "sunromvec"
  67.  * MUST HAVE A CORRESPONDING ENTRY IN VECTOR TABLE "vector_table", which 
  68.  * resides in file "../sun4/traptable.s".
  69.  * 
  70.  * The easiest way to reference elements of these TABLEs is to say:
  71.  *      *romp->xxx
  72.  * as in:
  73.  *      (*romp->v_putchar)(c);
  74.  *
  75.  * Various entries have been added at various times.  As of the Rev N, the
  76.  * VECTOR TABLE includes an entry "v_romvec_version" which is an integer 
  77.  * defining which entries in the table are valid.  The "V1:" type comments 
  78.  * on each entry state which version the entry first appeared in.  In order
  79.  * to determine if the Monitor your program is running under contains the 
  80.  * entry, you can simply compare the value of "v_romvec_version" to the 
  81.  * constant in the comment field.  For example,
  82.  *      if (romp->v_romvec_version >= 1) {
  83.  *        reference *romp->v_memorybitmap...
  84.  *      } else {
  85.  *        running under older version of the Monitor...
  86.  *      }
  87.  * Entries which do not contain a "Vn:" comment are in all versions.
  88.  */
  89. struct sunromvec {
  90.   char               *v_initsp;        /* Initial Stack Pointer for hardware.*/
  91.   void               (*v_startmon)();  /* Initial PC for hardware.           */
  92.   int                *v_diagberr;      /* Bus error handler for diagnostics. */
  93.   /* 
  94.    * Configuration information passed to standalone code and UNIX. 
  95.    */
  96.   struct   bootparam **v_bootparam;    /* Information for boot-strapped pgm. */
  97.   unsigned int       *v_memorysize;    /* Total physical memory in bytes.    */
  98.   /* 
  99.    * Single character input and output.
  100.    */
  101.   unsigned char      (*v_getchar)();   /* Get a character from input source. */
  102.   void               (*v_putchar)();   /* Put a character to output sink.    */
  103.   int                (*v_mayget)();    /* Maybe get a character, or "-1".    */
  104.   int                (*v_mayput)();    /* Maybe put a character, or "-1".    */
  105.   unsigned char      *v_echo;          /* Should "getchar" echo input?       */
  106.   unsigned char      *v_insource;      /* Current source of input.           */
  107.   unsigned char      *v_outsink;       /* Currrent output sink.              */
  108.   /* 
  109.    * Keyboard input and frame buffer output.
  110.    */
  111.   int                (*v_getkey)();    /* Get next key if one is available.  */
  112.   void               (*v_initgetkey)();/* Initialization for "getkey".       */
  113.   unsigned int       *v_translation;   /* Keyboard translation selector.     */
  114.   unsigned char      *v_keybid;        /* Keyboard ID byte.                  */
  115.   int                *v_screen_x;      /* V2: Screen x pos (R/O).            */
  116.   int                *v_screen_y;      /* V2: Screen y pos (R/O).            */
  117.   struct keybuf      *v_keybuf;        /* Up/down keycode buffer.            */
  118.  
  119.   char               *v_mon_id;        /* Revision level of the monitor.     */
  120.   /* 
  121.    * Frame buffer output and terminal emulation.
  122.    */
  123.   void               (*v_fwritechar)();/* Write a character to frame buffer. */
  124.   int                *v_fbaddr;        /* Address of frame buffer.           */
  125.   char               **v_font;         /* Font table for frame buffer.       */
  126.   void               (*v_fwritestr)(); /* Quickly write a string to frame    *
  127.                                         * buffer.                            */
  128.   /* 
  129.    * Re-boot interface routine.  Resets and re-boots system.  No return. 
  130.    */
  131.   void               (*v_boot_me)();   /* For example, boot_me("xy()vmunix").*/
  132.   /* 
  133.    * Command line input and parsing.
  134.    */
  135.   unsigned char      *v_linebuf;       /* The command line buffer.           */
  136.   unsigned char      **v_lineptr;      /* Current pointer into "linebuf".    */
  137.   int                *v_linesize;      /* Length of current command line.    */
  138.   void               (*v_getline)();   /* Get a command line from user.      */
  139.   unsigned char      (*v_getone)();    /* Get next character from "linebuf". */
  140.   unsigned char      (*v_peekchar)();  /* Peek at next character without     *
  141.                                         * advancing pointer.                 */
  142.   int                *v_fbthere;       /* Is there a frame buffer or not?    *
  143.                                         * 1=yes.                             */
  144.   int                (*v_getnum)();    /* Grab hex number from command line. */
  145.   /* 
  146.    * Phrase output to current output sink.
  147.    */
  148.   int                (*v_printf)();    /* Similar to Kernel's "printf".      */
  149.   void               (*v_printhex)();  /* Format N digits in hexadecimal.    */
  150.  
  151.   unsigned char      *v_leds;          /* RAM copy of LED register value.    */
  152.   void               (*v_set_leds)();  /* Sets LEDs and RAM copy             */
  153.   /* 
  154.    * The nmi related information. 
  155.    */
  156.   void               (*v_nmi)();       /* Address for the Sun-4 level 14     *
  157.                                         * interrupt vector.                  */
  158.   void               (*v_abortent)();  /* Entry for keyboard abort.          */
  159.   int                *v_nmiclock;      /* Counts in milliseconds.            */
  160.  
  161.   int                *v_fbtype;        /* Frame buffer type: see <sun/fbio.h>*/
  162.   /* 
  163.    * Assorted other things.
  164.    */
  165.   unsigned int       v_romvec_version; /* Version number of "romvec".        */
  166.   struct   globram   *v_gp;            /* Monitor's global variables.        */
  167.   struct zscc_device *v_keybzscc;      /* Address of keyboard in use.        */
  168.   int                *v_keyrinit;      /* Millisecs before keyboard repeat.  */
  169.   unsigned char      *v_keyrtick;      /* Millisecs between repetitions.     */
  170.   unsigned int       *v_memoryavail;   /* V1: Size of usable main memory.    */
  171.   long               *v_resetaddr;     /* where to jump on a RESET trap.     */
  172.   long               *v_resetmap;      /* Page map entry for "resetaddr".    */
  173.   void               (*v_exit_to_mon)();/* Exit from user program.           */
  174.   unsigned char      **v_memorybitmap; /* V1: Bit map of main memory or NULL.*/
  175. #ifndef sun3x
  176.   void               (*v_setcxsegmap)();/* Set segment in any context.       */
  177. #endif sun3x
  178.   void               (**v_vector_cmd)();/* V2: Handler for the 'w' (vector)  *
  179.                                         * command.                           */
  180. #if defined(sun4) || defined(sun4c)
  181.   unsigned long      *v_exp_trap_signal;/* V3: Location of the expected trap *
  182.                                         * signal.  Was trap expected or not? */
  183.   unsigned long      *v_trap_vector_table_base; /* V3: Address of the TRAP   *
  184.                                         * VECTOR TABLE which exists in RAM.  */
  185. #endif sun4 || sun4c
  186. #ifdef sun4c
  187.   struct physmemory  *v_physmemory;    /* ptr to memory list */
  188.   unsigned int       *v_monmemory;    /* memory taken by monitor */
  189.   struct config_ops  *v_config_ops;    /* configuration operations */
  190. #endif sun4c
  191.  
  192. #ifdef sun3x
  193.   int                **v_lomemptaddr;    /* address of low memory ptes      */
  194.   int                **v_monptaddr;      /* address of debug/mon ptes       */
  195.   int                **v_dvmaptaddr;     /* address of dvma ptes            */
  196.   int                 **v_monptphysaddr;  /* Physical Addr of the KADB PTE's */
  197.   int                **v_shadowpteaddr;  /* addr of shadow cp of DVMA pte's */
  198.   struct physmemory  *v_physmemory;      /* Ptr to memory list for Hydra    */
  199. #endif sun3x
  200.   int                dummy1z;
  201.   int                dummy2z;
  202.   int                dummy3z;
  203.   int                dummy4z;
  204. };
  205.  
  206. /*
  207.  * THE FOLLOWING CONSTANT, "romp" MUST BE CHANGED ANYTIME THE VALUE OF 
  208.  * "PROM_BASE" IN file "../sun2/cpu.addrs.h" (for Sun-2), file 
  209.  * "../sun3/cpu.addrs.h" (for Sun-3) or file "../sun4/cpu.addrs.h" (for Sun-4)
  210.  * IS CHANGED.  IT IS CONSTANT HERE SO THAT EVERY MODULE WHICH NEEDS AN ADDRESS
  211.  * OUT OF STRUCTURE "sunromvec" DOES NOT HAVE TO INCLUDE the appropriate
  212.  * "cpu.addrs.h" file.
  213.  *
  214.  * Since Sun-4 supports 32-bit addressing, rather than 28-bit addressing as is
  215.  * supported by Sun-3, the value of "romp" had to be increased.  Furthermore, 
  216.  * since the VECTOR TABLE, which appeared at the beginning of Sun-3 firmware,
  217.  * now appears after the 4K-byte TRAP TABLE in Sun-4 firmware, the value of
  218.  * "romp" was incresed by an additional 4K.
  219.  *
  220.  * If the value of "romp" is changed, several other changes are required.
  221.  * A complete list of required changes is given below.
  222.  *    (1) Makefile:             RELOC=
  223.  *    (2) ../sun2/cpu.addrs.h:  #define PROM_BASE (for Sun-2)
  224.  * or
  225.  *    (2) ../sun3/cpu.addrs.h:  #define PROM_BASE (for Sun-3)
  226.  * or
  227.  *    (2) ../sun3x/cpu.addrs.h:  #define PROM_BASE (for Sun-3x)
  228.  * or
  229.  *    (2) ../sun4/cpu.addrs.h:  #define PROM_BASE (for Sun-4)
  230.  *
  231.  */
  232. #ifdef sun4c
  233. extern struct sunromvec *romp;
  234. #else sun4c
  235. #ifdef sun4
  236. #define romp ((struct sunromvec *) 0xFFE81000) /* Used when running the  *
  237.                                                 * firmware out of ROM.   */
  238. #else sun4
  239. /*
  240.  * Notce that the value of "romp" will be 
  241.  * truncated based on the running hardware:
  242.  *   Sun-2   0x00EF0000
  243.  *   Sun-3   0x0FEF0000
  244.  *   Sun-3x  0xFEFE00000
  245.  * This was deliberately done for Sun-3 so that programs using this header
  246.  * file (with the Sun-3 support) would continue to run on Sun-2 systems.
  247.  */
  248. #ifdef sun3x
  249. #define romp ((struct sunromvec *) 0xFEFE0000)    /* Pegasus romp-> */
  250. #else sun3x
  251. #define romp ((struct sunromvec *) 0x0FEF0000)
  252. #endif sun3x
  253. #endif sun4 
  254. #endif sun4c
  255. #endif OPENPROMS
  256.  
  257. /*
  258.  * The possible values for "*romp->v_insource" and "*romp->v_outsink" are 
  259.  * listed below.  These may be extended in the future.  Your program should
  260.  * cope with this gracefully (e.g. by continuing to vector through the ROM
  261.  * I/O routines if these are set in a way you don't understand).
  262.  */
  263. #define INKEYB    0 /* Input from parallel keyboard. */
  264. #define INUARTA   1 /* Input or output to Uart A.    */
  265. #define INUARTB   2 /* Input or output to Uart B.    */
  266. #define INUARTC   3 /* Input or output to Uart C.    */
  267. #define INUARTD   4 /* Input or output to Uart D.    */
  268. #define OUTSCREEN 0 /* Output to frame buffer.       */
  269. #define OUTUARTA  1 /* Input or output to Uart A.    */
  270. #define OUTUARTB  2 /* Input or output to Uart B.    */
  271. #define OUTUARTC  3 /* Input or output to Uart C.    */
  272. #define OUTUARTD  4 /* Input or output to Uart D.    */
  273.  
  274. /*
  275.  * Structure set up by the boot command to pass arguments to the booted program.
  276.  */
  277. struct bootparam {
  278.   char            *bp_argv[8];     /* String arguments.                     */
  279.   char            bp_strings[100]; /* String table for string arguments.    */
  280.   char            bp_dev[2];       /* Device name.                          */
  281.   int             bp_ctlr;         /* Controller Number.                    */
  282.   int             bp_unit;         /* Unit Number.                          */
  283.   int             bp_part;         /* Partition/file Number.                */
  284.   char            *bp_name;        /* File name.  Points into "bp_strings". */
  285.   struct boottab  *bp_boottab;     /* Points to table entry for device.     */
  286. };
  287.  
  288. /*
  289.  * This table entry describes a device.  It exists in the PROM.  A pointer to
  290.  * it is passed in "bootparam".  It can be used to locate ROM subroutines for 
  291.  * opening, reading, and writing the device.  NOTE: When using this interface, 
  292.  * only ONE device can be open at any given time.  In other words, it is not
  293.  * possible to open a tape and a disk at the same time.
  294.  */
  295. struct boottab {
  296.   char           b_dev[2];        /* Two character device name.          */
  297.   int            (*b_probe)();    /* probe(): "-1" or controller number. */
  298.   int            (*b_boot)();     /* boot(bp): "-1" or start address.    */
  299.   int            (*b_open)();     /* open(iobp): "-"1 or "0".            */
  300.   int            (*b_close)();    /* close(iobp): "-"1 or "0".           */
  301.   int            (*b_strategy)(); /* strategy(iobp, rw): "-1" or "0".    */
  302.   char           *b_desc;         /* Printable string describing device. */
  303.   struct devinfo *b_devinfo;      /* Information to configure device.    */
  304. };
  305.  
  306. enum MAPTYPES { /* Page map entry types. */
  307.   MAP_MAINMEM, 
  308.   MAP_OBIO, 
  309.   MAP_MBMEM, 
  310.   MAP_MBIO,
  311.   MAP_VME16A16D, 
  312.   MAP_VME16A32D,
  313.   MAP_VME24A16D, 
  314.   MAP_VME24A32D,
  315.   MAP_VME32A16D, 
  316.   MAP_VME32A32D
  317. };
  318.  
  319. /*
  320.  * This table gives information about the resources needed by a device.  
  321.  */
  322. struct devinfo {
  323.   unsigned int      d_devbytes;   /* Bytes occupied by device in IO space.  */
  324.   unsigned int      d_dmabytes;   /* Bytes needed by device in DMA memory.  */
  325.   unsigned int      d_localbytes; /* Bytes needed by device for local info. */
  326.   unsigned int      d_stdcount;   /* How many standard addresses.           */
  327.   unsigned long     *d_stdaddrs;  /* The vector of standard addresses.      */
  328.   enum     MAPTYPES d_devtype;    /* What map space device is in.           */
  329.   unsigned int      d_maxiobytes; /* Size to break big I/O's into.          */
  330. };
  331.  
  332. /*
  333.  * This following defines the memory map interface
  334.  * between the ROM Monitor and the Unix kernel.
  335.  *
  336.  * The ROM Monitor requires that nobody mess with parts of virtual memory if 
  337.  * they expect any ROM Monitor services.  The following rules apply to all of
  338.  * the virtual addresses between MONSTART and MONEND.
  339.  *   (1) Do not write to these addresses.
  340.  *   (2) Do not read from (depend on the contents of) these addresses, except
  341.  *       as documented here or in <mon/sunromvec.h>.
  342.  *   (3) Do not re-map these addresses.
  343.  *   (4) Do not change or double-map the pmegs that these addresses map through.
  344.  *   (5) Do not change or double-map the main memory that these addresses map 
  345.  *       to.
  346.  *   (6) You are free to change or double-map I/O devices which these addresses
  347.  *       map to.
  348.  *   (7) These rules apply in all map contexts.
  349.  */
  350. #ifndef    OPENPROMS
  351. #ifdef sun2 
  352. #define MONSTART 0x00E00000
  353. #define MONEND   0x00F00000
  354. #endif sun2
  355.  
  356. #ifdef sun3 
  357. #define MONSTART 0x0FE00000
  358. #define MONEND   0x0FF00000
  359. #endif sun3 
  360.  
  361. #ifdef sun3x
  362. #define MONSTART 0xFEF00000
  363. #define MONEND   0xFF000000
  364. #endif sun3x
  365.  
  366. #if defined(sun4) || defined(sun4c)
  367. #define MONSTART 0xFFD00000
  368. #define MONEND   0xFFF00000
  369. #endif sun4 || sun4c
  370. #endif    OPENPROMS
  371.  
  372. #if !defined(sun4) && !defined(sun4c)
  373. /*
  374.  * The one page at MONSHORTPAGE must remain mapped to the same piece
  375.  * of main memory.  The pmeg used to map it there can be changed if so
  376.  * desired.  This page should not be read from or written in.  It is
  377.  * used for ROM Monitor globals, since it is addressable with short
  378.  * absolute instructions.  (We give a 32-bit value below so the
  379.  * compiler/assembler will use absolute short addressing.  The hardware
  380.  * will accept either 0 or 0xF as the top 4 bits.)
  381.  */
  382. #define MONSHORTPAGE 0xFFFFE000
  383. #define MONSHORTSEG  0xFFFE0000
  384. #endif !sun4 && !sun4c
  385.  
  386. #if defined(sun4) || defined(sun4c)
  387. /*
  388.  * The one page at GLOBAL_PAGE must remain mapped to the same piece of main 
  389.  * memory.  The pmeg used to map it there can be changed if desired.  This page
  390.  * should not be read from or written into.  It is used for Monitor globals.
  391.  */
  392. #define GLOBAL_PAGE 0xFFEFE000
  393. #endif sun4 
  394. #ifdef sun3x
  395. #define GLOBAL_PAGE 0xFEF72000
  396. #endif sun3x
  397.  
  398. /*
  399.  * For virtual addresses outside the above range, you can re-map the addresses 
  400.  * as desired (but see MONSHORTPAGE).  Any pmeg not referenced by segments 
  401.  * between MONSTART and MONEND can be used freely (but see MONSHORTPAGE).  
  402.  * When a stand-alone program is booted, available main memory will be mapped
  403.  * contiguously, using ascending physical page addresses, starting at virtual
  404.  * address "0x00000000".  The complete set of available memory  may not be  
  405.  * mapped due to a lack of pmegs.  The complete set is defined by globals 
  406.  * "v_memorysize", "v_memoryavail" and "v_memorybitmap".  For non-Sun-4
  407.  * machines, we guarantee that at least MAINMEM_MAP_SIZE page map entries
  408.  * will be available for mapping starting from location "0x0".  For Sun-4, 
  409.  * (at least at the time of Sunrise and Cobra), we guarantee that at least
  410.  * 4 megabytes will be mapped beginning with location "0x0".  When a 
  411.  * stand-alone program is booted, the number of segment table entries required
  412.  * to map DVMA_MAP_SIZE bytes will be allocated.  The corresponding pages will 
  413.  * be mapped into DVMA space.
  414.  */
  415. #ifdef sun2 
  416. #define MAINMEM_MAP_SIZE 0x00600000
  417. #define DVMA_MAP_SIZE    0x00080000
  418. #endif sun2 
  419.  
  420. #ifdef sun3 
  421. #define MAINMEM_MAP_SIZE 0x00800000
  422. #define DVMA_MAP_SIZE    0x00080000
  423. #endif sun3 
  424.  
  425. #ifdef sun3x
  426. #define MAINMEM_MAP_SIZE 0x00800000    /* Eight Megabytes */
  427. #define DVMA_MAP_SIZE    0x00100000    /* One Megabyte */
  428. #endif
  429.  
  430. #if defined(sun4) && !defined(sun4c)
  431. #ifdef sunray
  432. #define MAINMEM_MAP_SIZE 0x02000000
  433. #else sunray
  434. #define MAINMEM_MAP_SIZE 0x00800000
  435. #endif sunray
  436. #define DVMA_MAP_SIZE    0x00080000
  437. #endif
  438.  
  439. #ifdef sun4c
  440. #define MAINMEM_MAP_SIZE 0x00400000
  441. #define DVMA_MAP_SIZE    0x00080000
  442. #endif
  443.  
  444. /*
  445.  * The following are included for compatability with previous versions
  446.  * of this header file.  Names containing capital letters have been
  447.  * changed to conform with "Bill Joy Normal Form".  This section provides
  448.  * the translation between the old and new names.  It can go away once
  449.  * Sun-1 applications have been converted over.
  450.  */
  451. #define RomVecPtr       romp
  452. #define v_SunRev        v_mon_id
  453. #define v_MemorySize    v_memorysize
  454. #define v_EchoOn        v_echo
  455. #define v_InSource      v_insource
  456. #define v_OutSink       v_outsink
  457. #define v_InitGetkey    v_initgetkey
  458. #define v_KeybId        v_keybid
  459. #define v_Keybuf        v_keybuf
  460. #define v_FBAddr        v_fbaddr
  461. #define v_FontTable     v_font
  462. #define v_message       v_printf
  463. #define v_KeyFrsh       v_nmi
  464. #define AbortEnt        v_abortent
  465. #define v_RefrCnt       v_nmiclock
  466. #define v_GlobPtr       v_gp
  467. #define v_KRptInitial   v_keyrinit
  468. #define v_KRptTick      v_keyrtick
  469. #define v_ExitOp        v_exit_to_mon
  470. #define v_fwrstr        v_fwritestr
  471. #define v_linbuf        v_linebuf
  472.  
  473. #endif /*!_mon_sunromvec_h*/
  474.